package com.kamistoat.meimeistore.commonsecurity.utils;

import com.alibaba.fastjson2.JSONArray;
import com.kamistoat.meimeistore.apisystem.entity.SysDictDataEntity;
import com.kamistoat.meimeistore.commoncore.constant.CacheConstants;
import com.kamistoat.meimeistore.commoncore.utils.StringUtils;
import com.kamistoat.meimeistore.commonredis.utils.RedissonUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Collection;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

/**
 * 系统字典缓存工具类.
 * 是按照 SysDictData.dict_type 进行的缓存。
 */
@Component
public class DictUtils {
    // 源码用的是 private static final RedisUtils redisUtils = SpringUtils.getBean(RedisUtils.class);
    // 源码使用RedisTemplate，这里改成使用 redisson
    @Autowired
    RedissonUtils redissonUtils;

    /**
     * 设置系统字段缓存的 key
     * 将传入的key拼接上redis前缀。以下的所有方法的输入key均为不含redis前缀的key
     * @return
     */
    public String getCacheKey(String dictType) {
        return CacheConstants.SYS_DICT_KEY + dictType;
    }

    /**
     * 设置系统字典缓存，过期时间1天
     *
     * @param dictType          字典名(不包含前缀)
     * @param sysDictDataEntityList 元素是 SYSDictDataEntity
     */
    public void setDictCache(String dictType, List<SysDictDataEntity> sysDictDataEntityList) {
        redissonUtils.setCacheObject(getCacheKey(dictType), sysDictDataEntityList, 1, TimeUnit.DAYS);
    }

    /**
     * 获取系统字典缓存。
     */
    public List<SysDictDataEntity> getDictCache(String dictType) {
        // 只要保证存的时候一定是传入列表，那么拿出来的时候也是可以直接转型成JSON列表的
        JSONArray arrayCache = redissonUtils.getCacheObject(getCacheKey(dictType));
        if (StringUtils.isNotNull(arrayCache)) {
            // 将JSON列表转型成实例列表
            return arrayCache.toList(SysDictDataEntity.class);
        }
        return null;
    }

    /**
     * 删除指定的系统字典缓存
     */
    public void removeDictCache(String dictType) {
        redissonUtils.deleteObject(getCacheKey(dictType));
    }

    public void removeDictCache(Collection<String> dictType) {
        List<String> typeList = dictType.stream().map(key -> {
            return getCacheKey(key);
        }).collect(Collectors.toList());
        redissonUtils.deleteObject(typeList);
    }

    /**
     * 清空所有的字典缓存
     */
    public void clearDictCache() {
        Collection<String> keys = redissonUtils.keys(CacheConstants.SYS_DICT_KEY + "*");
        redissonUtils.deleteObject(keys);
    }


}
